//
//  LocalFileNameParserTests.swift
//  Aidoku
//
//  Created by Skitty on 11/13/25.
//

import Testing
@testable import Aidoku

// https://github.com/Kareadita/Kavita/blob/develop/API.Tests/Parsing/MangaParsingTests.cs
@Suite struct LocalFileNameParserTests {
    @Test(
        "Manga volumes",
        arguments: [
            ("Killing Bites Vol. 0001 Ch. 0001 - Galactica Scanlations (gb)", "1"),
            ("My Girlfriend Is Shobitch v01 - ch. 09 - pg. 008.png", "1"),
            ("Historys Strongest Disciple Kenichi_v11_c90-98.zip", "11"),
            ("B_Gata_H_Kei_v01[SlowManga&OverloadScans]", "1"),
            ("BTOOOM! v01 (2013) (Digital) (Shadowcat-Empire)", "1"),
            ("Gokukoku no Brynhildr - c001-008 (v01) [TrinityBAKumA]", "1"),
            ("Dance in the Vampire Bund v16-17 (Digital) (NiceDragon)", "16-17"),
            ("Akame ga KILL! ZERO v01 (2016) (Digital) (LuCaZ).cbz", "1"),
            ("v001", "1"),
            ("Vol 1", "1"),
            ("vol_356-1", "356"), // Mangapy syntax
            ("No Volume", ""),
            ("U12 (Under 12) Vol. 0001 Ch. 0001 - Reiwa Scans (gb)", "1"),
            ("[Suihei Kiki]_Kasumi_Otoko_no_Ko_[Taruby]_v1.1.zip", "1.1"),
            ("Tonikaku Cawaii [Volume 11].cbz", "11"),
            ("[WS]_Ichiban_Ushiro_no_Daimaou_v02_ch10.zip", "2"),
            ("[xPearse] Kyochuu Rettou Volume 1 [English] [Manga] [Volume Scans]", "1"),
            ("Tower Of God S01 014 (CBT) (digital).cbz", "1"),
            ("Tenjou_Tenge_v17_c100[MT].zip", "17"),
            ("Shimoneta - Manmaru Hen - c001-006 (v01) [Various].zip", "1"),
            ("Future Diary v02 (2009) (Digital) (Viz).cbz", "2"),
            ("Mujaki no Rakuen Vol12 ch76", "12"),
            ("Ichinensei_ni_Nacchattara_v02_ch11_[Taruby]_v1.3.zip", "2"),
            ("Dorohedoro v01 (2010) (Digital) (LostNerevarine-Empire).cbz", "1"),
            ("Dorohedoro v11 (2013) (Digital) (LostNerevarine-Empire).cbz", "11"),
            ("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "1"),
            ("Yumekui-Merry_DKThias_Chapter11v2.zip", ""),
            ("Itoshi no Karin - c001-006x1 (v01) [Renzokusei Scans]", "1"),
            ("Kedouin Makoto - Corpse Party Musume, Chapter 12", ""),
            ("VanDread-v01-c001[MD].zip", "1"),
            ("Ichiban_Ushiro_no_Daimaou_v04_ch27_[VISCANS].zip", "4"),
            ("Mob Psycho 100 v02 (2019) (Digital) (Shizu).cbz", "2"),
            ("Kodomo no Jikan vol. 1.cbz", "1"),
            ("Kodomo no Jikan vol. 10.cbz", "10"),
            ("Kedouin Makoto - Corpse Party Musume, Chapter 12 [Dametrans][v2]", ""),
            ("Vagabond_v03", "3"),
            ("Mujaki No Rakune Volume 10.cbz", "10"),
            ("Umineko no Naku Koro ni - Episode 3 - Banquet of the Golden Witch #02.cbz", ""),
            ("Volume 12 - Janken Boy is Coming!.cbz", "12"),
            ("[dmntsf.net] One Piece - Digital Colored Comics Vol. 20 Ch. 177 - 30 Million vs 81 Million.cbz", "20"),
            ("Gantz.V26.cbz", "26"),
            ("NEEDLESS_Vol.4_-Simeon_6_v2[SugoiSugoi].rar", "4"),
            ("[Hidoi]_Amaenaideyo_MS_vol01_chp02.rar", "1"),
            ("NEEDLESS_Vol.4_-_Simeon_6_v2_[SugoiSugoi].rar", "4"),
            ("Okusama wa Shougakusei c003 (v01) [bokuwaNEET]", "1"),
            ("Sword Art Online Vol 10 - Alicization Running [Yen Press] [LuCaZ] {r2}.epub", "10"),
            ("Noblesse - Episode 406 (52 Pages).7z", ""),
            ("X-Men v1 #201 (September 2007).cbz", "1"),
            ("Hentai Ouji to Warawanai Neko. - Vol. 06 Ch. 034.5", "6"),
            ("The 100 Girlfriends Who Really, Really, Really, Really, Really Love You - Vol. 03 Ch. 023.5 - Volume 3 Extras.cbz", "3"),
            ("The 100 Girlfriends Who Really, Really, Really, Really, Really Love You - Vol. 03.5 Ch. 023.5 - Volume 3 Extras.cbz", "3.5"),
            ("幽游白书完全版 第03卷 天下", "3"),
            ("阿衰online 第1册", "1"),
            ("【TFO汉化&Petit汉化】迷你偶像漫画卷2第25话", "2"),
            ("スライム倒して300年、知らないうちにレベルMAXになってました 1巻", "1"),
            ("スライム倒して300年、知らないうちにレベルMAXになってました 1-3巻", "1-3"),
            ("Dance in the Vampire Bund {Special Edition} v03.5 (2019) (Digital) (KG Manga)", "3.5"),
            ("Kebab Том 1 Глава 3", "1"),
            ("Манга Глава 2", ""),
            ("Манга Тома 1-4", "1-4"),
            ("Манга Том 1-4", "1-4"),
            ("조선왕조실톡 106화", "106"),
            ("동의보감 13장", "13"),
            ("몰?루 아카이브 7.5권", "7.5"),
            ("63권#200", "63"),
            ("시즌34삽화2", "34"),
            ("시즌3-4삽화2", "3-4"),
            ("Accel World Chapter 001 Volume 002", "2"),
            ("Accel World Volume 2", "2"),
            ("Nagasarete Airantou - Vol. 30 Ch. 187.5 - Vol.31 Omake", "30"),
            ("Zom 100 - Bucket List of the Dead v01", "1"),
            // Tome Tests
            ("Daredevil - t6 - 10 - (2019)", "6"),
            ("Batgirl T2000 #57", "2000"),
            ("Teen Titans t1 001 (1966-02) (digital) (OkC.O.M.P.U.T.O.-Novus)", "1"),
            ("Conquistador_Tome_2", "2"),
            ("Max_l_explorateur-_Tome_0", "0"),
            ("Chevaliers d'Héliopolis T3 - Rubedo, l'oeuvre au rouge (Jodorowsky & Jérémy)", "3"),
            ("Adventure Time (2012)/Adventure Time  Ch 1 (2012)", ""),
            ("Adventure Time TPB (2012)/Adventure Time v01 (2012).cbz", "1"),
            ("Monster Ch. 001 [MangaPlus] [Digital] [amit34521]", ""),
            ("Alter Ego (2020) (Digital) (v3dio)", ""),
            ("Alter Ego (2020) (Digital) (t3dio)", "")
        ]
    )
    func testParseMangaVolume(filename: String, expected: String) async throws {
        #expect(LocalFileNameParser.parseMangaVolume(from: filename) == expected, "Failed for \(filename)")
    }

    @Test(
        "Manga volumes with duplicates",
        arguments: [
            ("One Piece - Vol 2 Ch 1.1 - Volume 4 Omakes", "2"),
            ("Attack on Titan - Vol. 5 Ch. 20 - Vol.10 Special", "5"),
            ("Naruto - Volume 1 Chapter 1 - Volume 2 Preview", "1"),
            ("My Hero Academia - Vol 15 - Vol 20 Extras", "15"),

            // Edge cases for duplicate detection
            ("Series - Vol 1 - Not Vol but Voldemort", "1"), // Should not trigger false positive
            ("Volume Wars - Vol 1 vs Vol 2", "1"), // Series name contains "Volume"
            ("Vol 3 - The Volume Chronicles - Vol 5", "3"), // Multiple volume references

            // Thai Volume tests
            ("เล่ม 5 - Chapter 1", "5"),
            ("เล่มที่ 12 Test", "12"),

            // Chinese Volume tests
            ("幽游白书完全版 第03卷 天下", "3"),
            ("阿衰online 第1册", "1"),
            ("卷5 Test", "5"),
            ("册10 Test", "10"),

            // Korean Volume tests
            ("제5권 Test", "5"),
            ("10화 Test", "10"),
            ("시즌3 Test", "3"),
            ("5시즌 Test", ""),

            // Japanese Volume tests
            ("Test 5巻", "5"),
            ("Series 10-15巻", "10-15"),

            // Russian Volume tests
            ("Том 5 Test", "5"),
            ("Тома 10 Test", "10"),
            ("5 Том Test", "5")
        ]
    )
    func testParseDuplicateMangaVolume(filename: String, expected: String) async throws {
        #expect(LocalFileNameParser.parseMangaVolume(from: filename) == expected, "Failed for \(filename)")
    }

    @Test(
        "Manga series titles",
        arguments: [
            ("Killing Bites Vol. 0001 Ch. 0001 - Galactica Scanlations (gb)", "Killing Bites"),
            ("My Girlfriend Is Shobitch v01 - ch. 09 - pg. 008.png", "My Girlfriend Is Shobitch"),
            ("Historys Strongest Disciple Kenichi_v11_c90-98.zip", "Historys Strongest Disciple Kenichi"),
            ("B_Gata_H_Kei_v01[SlowManga&OverloadScans]", "B Gata H Kei"),
            ("BTOOOM! v01 (2013) (Digital) (Shadowcat-Empire)", "BTOOOM!"),
            ("Gokukoku no Brynhildr - c001-008 (v01) [TrinityBAKumA]", "Gokukoku no Brynhildr"),
            ("Dance in the Vampire Bund v16-17 (Digital) (NiceDragon)", "Dance in the Vampire Bund"),
            ("v001", ""),
            ("U12 (Under 12) Vol. 0001 Ch. 0001 - Reiwa Scans (gb)", "U12"),
            ("Akame ga KILL! ZERO (2016-2019) (Digital) (LuCaZ)", "Akame ga KILL! ZERO"),
            ("APOSIMZ 017 (2018) (Digital) (danke-Empire).cbz", "APOSIMZ"),
            ("Akiiro Bousou Biyori - 01.jpg", "Akiiro Bousou Biyori"),
            ("Beelzebub_172_RHS.zip", "Beelzebub"),
            ("Dr. STONE 136 (2020) (Digital) (LuCaZ).cbz", "Dr. STONE"),
            ("Cynthia the Mission 29.rar", "Cynthia the Mission"),
            ("Darling in the FranXX - Volume 01.cbz", "Darling in the FranXX"),
            ("Darwin's Game - Volume 14 (F).cbz", "Darwin's Game"),
            ("[BAA]_Darker_than_Black_c7.zip", "Darker than Black"),
            ("Kedouin Makoto - Corpse Party Musume, Chapter 19 [Dametrans].zip", "Kedouin Makoto - Corpse Party Musume"),
            ("Kedouin Makoto - Corpse Party Musume, Chapter 01", "Kedouin Makoto - Corpse Party Musume"),
            ("[WS]_Ichiban_Ushiro_no_Daimaou_v02_ch10.zip", "Ichiban Ushiro no Daimaou"),
            ("[xPearse] Kyochuu Rettou Volume 1 [English] [Manga] [Volume Scans]", "Kyochuu Rettou"),
            ("Loose_Relation_Between_Wizard_and_Apprentice_c07[AN].zip", "Loose Relation Between Wizard and Apprentice"),
            ("Tower Of God S01 014 (CBT) (digital).cbz", "Tower Of God"),
            ("Tenjou_Tenge_c106[MT].zip", "Tenjou Tenge"),
            ("Tenjou_Tenge_v17_c100[MT].zip", "Tenjou Tenge"),
            ("Shimoneta - Manmaru Hen - c001-006 (v01) [Various].zip", "Shimoneta - Manmaru Hen"),
            ("Future Diary v02 (2009) (Digital) (Viz).cbz", "Future Diary"),
            ("Tonikaku Cawaii [Volume 11].cbz", "Tonikaku Cawaii"),
            ("Mujaki no Rakuen Vol12 ch76", "Mujaki no Rakuen"),
            ("Knights of Sidonia c000 (S2 LE BD Omake - BLAME!) [Habanero Scans]", "Knights of Sidonia"),
            ("Vol 1.cbz", ""),
            ("Ichinensei_ni_Nacchattara_v01_ch01_[Taruby]_v1.1.zip", "Ichinensei ni Nacchattara"),
            ("Chrno_Crusade_Dragon_Age_All_Stars[AS].zip", ""),
            ("Ichiban_Ushiro_no_Daimaou_v04_ch34_[VISCANS].zip", "Ichiban Ushiro no Daimaou"),
            ("Rent a Girlfriend v01.cbr", "Rent a Girlfriend"),
            ("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "Yumekui Merry"),
            ("Itoshi no Karin - c001-006x1 (v01) [Renzokusei Scans]", "Itoshi no Karin"),
            ("Tonikaku Kawaii Vol-1 (Ch 01-08)", "Tonikaku Kawaii"),
            ("Tonikaku Kawaii (Ch 59-67) (Ongoing)", "Tonikaku Kawaii"),
            ("7thGARDEN v01 (2016) (Digital) (danke).cbz", "7thGARDEN"),
            ("Kedouin Makoto - Corpse Party Musume, Chapter 12", "Kedouin Makoto - Corpse Party Musume"),
            ("Kedouin Makoto - Corpse Party Musume, Chapter 09", "Kedouin Makoto - Corpse Party Musume"),
            ("Goblin Slayer Side Story - Year One 025.5", "Goblin Slayer Side Story - Year One"),
            ("Goblin Slayer - Brand New Day 006.5 (2019) (Digital) (danke-Empire)", "Goblin Slayer - Brand New Day"),
            ("Kedouin Makoto - Corpse Party Musume, Chapter 01 [Dametrans][v2]", "Kedouin Makoto - Corpse Party Musume"),
            ("Vagabond_v03", "Vagabond"),
            ("[AN] Mahoutsukai to Deshi no Futekisetsu na Kankei Chp. 1", "Mahoutsukai to Deshi no Futekisetsu na Kankei"),
            ("Beelzebub_Side_Story_02_RHS.zip", "Beelzebub Side Story"),
            ("Baketeriya ch01-05.zip", "Baketeriya"),
            ("[PROzess]Kimi_ha_midara_na_Boku_no_Joou_-_Ch01", "Kimi ha midara na Boku no Joou"),
            ("[SugoiSugoi]_NEEDLESS_Vol.2_-_Disk_The_Informant_5_[ENG].rar", "NEEDLESS"),
            ("Fullmetal Alchemist chapters 101-108.cbz", "Fullmetal Alchemist"),
            ("To Love Ru v09 Uncensored (Ch.071-079).cbz", "To Love Ru"),
            ("[dmntsf.net] One Piece - Digital Colored Comics Vol. 20 Ch. 177 - 30 Million vs 81 Million.cbz", "One Piece - Digital Colored Comics"),
            (
                "Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U Chapter 01",
                "Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U"
            ),
            ("Vol03_ch15-22.rar", ""),
            ("Love Hina - Special.cbz", ""), // This has to be a fallback case
            ("Ani-Hina Art Collection.cbz", ""), // This has to be a fallback case
            ("Magi - Ch.252-005.cbz", "Magi"),
            ("Umineko no Naku Koro ni - Episode 1 - Legend of the Golden Witch #1", "Umineko no Naku Koro ni"),
            ("Kimetsu no Yaiba - Digital Colored Comics c162 Three Victorious Stars.cbz", "Kimetsu no Yaiba - Digital Colored Comics"),
            ("[Hidoi]_Amaenaideyo_MS_vol01_chp02.rar", "Amaenaideyo MS"),
            ("NEEDLESS_Vol.4_-_Simeon_6_v2_[SugoiSugoi].rar", "NEEDLESS"),
            ("Okusama wa Shougakusei c003 (v01) [bokuwaNEET]", "Okusama wa Shougakusei"),
            ("VanDread-v01-c001[MD].zip", "VanDread"),
            ("Momo The Blood Taker - Chapter 027 Violent Emotion.cbz", "Momo The Blood Taker"),
            ("Kiss x Sis - Ch.15 - The Angst of a 15 Year Old Boy.cbz", "Kiss x Sis"),
            ("Green Worldz - Chapter 112 Final Chapter (End).cbz", "Green Worldz"),
            ("Noblesse - Episode 406 (52 Pages).7z", "Noblesse"),
            ("X-Men v1 #201 (September 2007).cbz", "X-Men"),
            ("Kodoja #001 (March 2016)", "Kodoja"),
            ("Boku No Kokoro No Yabai Yatsu - Chapter 054 I Prayed At The Shrine (V0).cbz", "Boku No Kokoro No Yabai Yatsu"),
            ("Kiss x Sis - Ch.36 - A Cold Home Visit.cbz", "Kiss x Sis"),
            ("Seraph of the End - Vampire Reign 093 (2020) (Digital) (LuCaZ)", "Seraph of the End - Vampire Reign"),
            ("Grand Blue Dreaming - SP02 Extra (2019) (Digital) (danke-Empire).cbz", "Grand Blue Dreaming"),
            ("Yuusha Ga Shinda! - Vol.tbd Chapter 27.001 V2 Infection ①.cbz", "Yuusha Ga Shinda!"),
            ("Seraph of the End - Vampire Reign 093 (2020) (Digital) (LuCaZ).cbz", "Seraph of the End - Vampire Reign"),
            ("Getsuyoubi no Tawawa - Ch. 001 - Ai-chan, Part 1", "Getsuyoubi no Tawawa"),
            ("Please Go Home, Akutsu-San! - Chapter 038.5 - Volume Announcement.cbz", "Please Go Home, Akutsu-San!"),
            ("Killing Bites - Vol 11 Chapter 050 Save Me, Nunupi!.cbz", "Killing Bites"),
            ("Mad Chimera World - Volume 005 - Chapter 026.cbz", "Mad Chimera World"),
            ("Hentai Ouji to Warawanai Neko. - Vol. 06 Ch. 034.5", "Hentai Ouji to Warawanai Neko."),
            (
                "The 100 Girlfriends Who Really, Really, Really, Really, Really Love You - Vol. 03 Ch. 023.5 - Volume 3 Extras.cbz",
                "The 100 Girlfriends Who Really, Really, Really, Really, Really Love You"
            ),
            ("Kimi no Koto ga Daidaidaidaidaisuki na 100-nin no Kanojo Chapter 1-10", "Kimi no Koto ga Daidaidaidaidaisuki na 100-nin no Kanojo"),
            ("The Duke of Death and His Black Maid - Ch. 177 - The Ball (3).cbz", "The Duke of Death and His Black Maid"),
            ("The Duke of Death and His Black Maid - Vol. 04 Ch. 054.5 - V4 Omake", "The Duke of Death and His Black Maid"),
            ("Vol. 04 Ch. 054.5", ""),
            ("Great_Teacher_Onizuka_v16[TheSpectrum]", "Great Teacher Onizuka"),
            ("[Renzokusei]_Kimi_wa_Midara_na_Boku_no_Joou_Ch5_Final_Chapter", "Kimi wa Midara na Boku no Joou"),
            ("Battle Royale, v01 (2000) [TokyoPop] [Manga-Sketchbook]", "Battle Royale"),
            ("Kaiju No. 8 036 (2021) (Digital)", "Kaiju No. 8"),
            ("Seraph of the End - Vampire Reign 093  (2020) (Digital) (LuCaZ).cbz", "Seraph of the End - Vampire Reign"),
            ("Love Hina - Volume 01 [Scans].pdf", "Love Hina"),
            ("It's Witching Time! 001 (Digital) (Anonymous1234)", "It's Witching Time!"),
            ("Zettai Karen Children v02 c003 - The Invisible Guardian (2) [JS Scans]", "Zettai Karen Children"),
            ("My Charms Are Wasted on Kuroiwa Medaka - Ch. 37.5 - Volume Extras", "My Charms Are Wasted on Kuroiwa Medaka"),
            ("Highschool of the Dead - Full Color Edition v02 [Uasaha] (Yen Press)", "Highschool of the Dead - Full Color Edition"),
            ("諌山創] 進撃の巨人 第23巻", "諌山創] 進撃の巨人"),
            ("(一般コミック) [奥浩哉] いぬやしき 第09巻", "いぬやしき"),
            ("Highschool of the Dead - 02", "Highschool of the Dead"),
            ("Kebab Том 1 Глава 3", "Kebab"),
            ("Манга Глава 2", "Манга"),
            ("Манга Глава 2-2", "Манга"),
            ("Манга Том 1 3-4 Глава", "Манга"),
            ("Esquire 6권 2021년 10월호", "Esquire"),
            ("Accel World: Vol 1", "Accel World"),
            ("Accel World Chapter 001 Volume 002", "Accel World"),
            ("Bleach 001-003", "Bleach"),
            ("Accel World Volume 2", "Accel World"),
            ("죠시라쿠! 2년 후 v01", "죠시라쿠! 2년 후"),
            ("죠시라쿠! 2년 후 1권", "죠시라쿠! 2년 후"),
            ("test 2 years 1권", "test 2 years"),
            ("test 2 years 1화", "test 2 years"),
            ("Nagasarete Airantou - Vol. 30 Ch. 187.5 - Vol.30 Omake", "Nagasarete Airantou"),
            ("Cynthia The Mission - c000 - c006 (v06)", "Cynthia The Mission"),
            ("เด็กคนนี้ขอลาออกจากการเป็นเจ้าของปราสาท เล่ม 1", "เด็กคนนี้ขอลาออกจากการเป็นเจ้าของปราสาท"),
            ("Max Level Returner เล่มที่ 5", "Max Level Returner"),
            ("หนึ่งความคิด นิจนิรันดร์ เล่ม 2", "หนึ่งความคิด นิจนิรันดร์"),
            ("不安の種＋ - 01", "不安の種＋"),
            ("Giant Ojou-sama - Ch. 33.5 - Volume 04 Bonus Chapter", "Giant Ojou-sama"),
            ("[218565]-(C92) [BRIO (Puyocha)] Mika-nee no Tanryoku Shidou - Mika s Guide to Self-Confidence (THE IDOLM@STE", ""),
            ("Monster #8 Ch. 001", "Monster #8"),
            ("Zom 100 - Bucket List of the Dead v01", "Zom 100 - Bucket List of the Dead"),
            ("Zom 100 - Tome 2", "Zom 100"),
            ("Max_l_explorateur Tome 0", "Max l explorateur"),
            ("Chevaliers d'Héliopolis T3 - Rubedo, l'oeuvre au rouge (Jodorowsky & Jérémy)", "Chevaliers d'Héliopolis"),
            ("Bd Fr-Aldebaran-Antares-t6", "Bd Fr-Aldebaran-Antares"),
            ("Monster Ch. 001 [MangaPlus] [Digital] [amit34521]", "Monster")
        ]
    )
    func testParseMangaSeries(filename: String, expected: String) async throws {
        #expect(LocalFileNameParser.parseMangaSeries(from: filename) == expected, "Failed for \(filename)")
    }

    @Test(
        "Manga chapters",
        arguments: [
            ("Killing Bites Vol. 0001 Ch. 0001 - Galactica Scanlations (gb)", "1"),
            ("My Girlfriend Is Shobitch v01 - ch. 09 - pg. 008.png", "9"),
            ("Historys Strongest Disciple Kenichi_v11_c90-98.zip", "90-98"),
            ("B_Gata_H_Kei_v01[SlowManga&OverloadScans]", ""),
            ("BTOOOM! v01 (2013) (Digital) (Shadowcat-Empire)", ""),
            ("Gokukoku no Brynhildr - c001-008 (v01) [TrinityBAKumA]", "1-8"),
            ("Dance in the Vampire Bund v16-17 (Digital) (NiceDragon)", ""),
            ("c001", "1"),
            ("[Suihei Kiki]_Kasumi_Otoko_no_Ko_[Taruby]_v1.12.zip", ""),
            ("Adding volume 1 with File: Ana Satsujin Vol. 1 Ch. 5 - Manga Box (gb).cbz", "5"),
            ("Hinowa ga CRUSH! 018 (2019) (Digital) (LuCaZ).cbz", "18"),
            ("Cynthia The Mission - c000-006 (v06) [Desudesu&Brolen].zip", "0-6"),
            ("[WS]_Ichiban_Ushiro_no_Daimaou_v02_ch10.zip", "10"),
            ("Loose_Relation_Between_Wizard_and_Apprentice_c07[AN].zip", "7"),
            ("Tower Of God S01 014 (CBT) (digital).cbz", "14"),
            ("Tenjou_Tenge_c106[MT].zip", "106"),
            ("Tenjou_Tenge_v17_c100[MT].zip", "100"),
            ("Shimoneta - Manmaru Hen - c001-006 (v01) [Various].zip", "1-6"),
            ("Mujaki no Rakuen Vol12 ch76", "76"),
            ("Beelzebub_01_[Noodles].zip", "1"),
            ("Yumekui-Merry_DKThias_Chapter21.zip", "21"),
            ("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "1"),
            ("Yumekui-Merry_DKThias_Chapter11v2.zip", "11"),
            ("Yumekui-Merry DKThiasScanlations Chapter51v2", "51"),
            ("Yumekui-Merry_DKThiasScanlations&RenzokuseiScans_Chapter61", "61"),
            ("Goblin Slayer Side Story - Year One 017.5", "17.5"),
            ("Beelzebub_53[KSH].zip", "53"),
            ("Black Bullet - v4 c20.5 [batoto]", "20.5"),
            ("Itoshi no Karin - c001-006x1 (v01) [Renzokusei Scans]", "1-6"),
            ("APOSIMZ 040 (2020) (Digital) (danke-Empire).cbz", "40"),
            ("Kedouin Makoto - Corpse Party Musume, Chapter 12", "12"),
            ("Vol 1", ""),
            ("VanDread-v01-c001[MD].zip", "1"),
            ("Goblin Slayer Side Story - Year One 025.5", "25.5"),
            ("Kedouin Makoto - Corpse Party Musume, Chapter 01", "1"),
            ("To Love Ru v11 Uncensored (Ch.089-097+Omake)", "89-97"),
            ("To Love Ru v18 Uncensored (Ch.153-162.5)", "153-162.5"),
            ("[AN] Mahoutsukai to Deshi no Futekisetsu na Kankei Chp. 1", "1"),
            ("Beelzebub_Side_Story_02_RHS.zip", "2"),
            ("[PROzess]Kimi_ha_midara_na_Boku_no_Joou_-_Ch01", "1"),
            ("Fullmetal Alchemist chapters 101-108.cbz", "101-108"),
            ("Umineko no Naku Koro ni - Episode 3 - Banquet of the Golden Witch #02.cbz", "2"),
            ("To Love Ru v09 Uncensored (Ch.071-079).cbz", "71-79"),
            ("Corpse Party -The Anthology- Sachikos game of love Hysteric Birthday 2U Extra Chapter.rar", ""),
            ("Beelzebub_153b_RHS.zip", "153.5"),
            ("Beelzebub_150-153b_RHS.zip", "150-153.5"),
            ("Transferred to another world magical swordsman v1.1", ""),
            ("Kiss x Sis - Ch.15 - The Angst of a 15 Year Old Boy.cbz", "15"),
            ("Kiss x Sis - Ch.12 - 1 , 2 , 3P!.cbz", "12"),
            ("Umineko no Naku Koro ni - Episode 1 - Legend of the Golden Witch #1", "1"),
            ("Kiss x Sis - Ch.00 - Let's Start from 0.cbz", "0"),
            ("[Hidoi]_Amaenaideyo_MS_vol01_chp02.rar", "2"),
            ("Okusama wa Shougakusei c003 (v01) [bokuwaNEET]", "3"),
            ("Tomogui Kyoushitsu - Chapter 006 Game 005 - Fingernails On Right Hand (Part 002).cbz", "6"),
            ("Noblesse - Episode 406 (52 Pages).7z", "406"),
            ("X-Men v1 #201 (September 2007).cbz", "201"),
            ("Kodoja #001 (March 2016)", "1"),
            ("Noblesse - Episode 429 (74 Pages).7z", "429"),
            ("Boku No Kokoro No Yabai Yatsu - Chapter 054 I Prayed At The Shrine (V0).cbz", "54"),
            ("Ijousha No Ai - Vol.01 Chapter 029 8 Years Ago", "29"),
            ("Kedouin Makoto - Corpse Party Musume, Chapter 09.cbz", "9"),
            ("Hentai Ouji to Warawanai Neko. - Vol. 06 Ch. 034.5", "34.5"),
            ("Kimi no Koto ga Daidaidaidaidaisuki na 100-nin no Kanojo Chapter 1-10", "1-10"),
            ("Deku_&_Bakugo_-_Rising_v1_c1.1.cbz", "1.1"),
            ("Chapter 63 - The Promise Made for 520 Cenz.cbr", "63"),
            ("Harrison, Kim - The Good, The Bad, and the Undead - Hollows Vol 2.5.epub", ""),
            ("Kaiju No. 8 036 (2021) (Digital)", "36"),
            ("Samurai Jack Vol. 01 - The threads of Time", ""),
            ("【TFO汉化&Petit汉化】迷你偶像漫画第25话", "25"),
            ("자유록 13회#2", "13"),
            ("이세계에서 고아원을 열었지만, 어째서인지 아무도 독립하려 하지 않는다 38-1화 ", "38"),
            ("[ハレム]ナナとカオル ～高校生のSMごっこ～　第10話", "10"),
            ("Dance in the Vampire Bund {Special Edition} v03.5 (2019) (Digital) (KG Manga)", ""),
            ("Kebab Том 1 Глава 3", "3"),
            ("Манга Глава 2", "2"),
            ("Манга 2 Глава", "2"),
            ("Манга Том 1 2 Глава", "2"),
            ("Accel World Chapter 001 Volume 002", "1"),
            ("Bleach 001-003", "1-3"),
            ("Accel World Volume 2", ""),
            ("Historys Strongest Disciple Kenichi_v11_c90-98", "90-98"),
            ("Historys Strongest Disciple Kenichi c01-c04", "1-4"),
            ("Adabana c00-02", "0-2"),
            ("เด็กคนนี้ขอลาออกจากการเป็นเจ้าของปราสาท เล่ม 1 ตอนที่ 3", "3"),
            ("Max Level Returner ตอนที่ 5", "5"),
            ("หนึ่งความคิด นิจนิรันดร์ บทที่ 112", "112"),
            ("Monster #8 Ch. 001", "1"),
            ("Monster Ch. 001 [MangaPlus] [Digital] [amit34521]", "1")
        ]
    )
    func testParseMangaChapter(filename: String, expected: String) async throws {
        #expect(LocalFileNameParser.parseMangaChapter(from: filename) == expected, "Failed for \(filename)")
    }

    @Test(
        "Manga chapters with duplicates",
        arguments: [
            ("Manga Title - Ch.1 - The 22 beers", "1"),
            ("Manga Title - Ch.1 Part.A - Ch.2 Omake", "1"),
            ("Another Series - Chapter 10 Something - Chapter 15 Extra", "10"),
            ("Test_Ch_3_Content_Ch_7_Bonus", "3"),
            ("One Piece - Ch 5 Part 1 - Chapter 10 Omakes", "5"),
            ("Attack on Titan - Chapter 20 Content - Ch 25 Special", "20"),
            ("Naruto - Ch. 1 Story - Ch. 5 Preview", "1"),
            ("My Hero Academia - Chapter 15 - Chapter 20 Extras", "15"),
            ("Series Name - c2 Content - c5 Bonus", "2"),
            ("Test Series - c1 Part1 - Chapter 3 Extra", "1"),
            ("Another Test - Chapter 7 - c10 Omake", "7"),
            ("Series - Ch 1 - Not Ch but Chaos", "1"),
            ("Chapter Wars - Ch 1 vs Ch 2", "1"),
            ("Ch 3 - The Chapter Chronicles - Ch 5", "3")
        ]
    )
    func testParseDuplicateMangaChapter(filename: String, expected: String) async throws {
        #expect(LocalFileNameParser.parseMangaChapter(from: filename) == expected, "Failed for \(filename)")
    }
}
